python - 用遗传算法解决0-1背包问题,遗传算法是基于概率论的,因此不一定能一次命中最优解

# coding=utf-8
'''
贪心算法:局部最优解。
动态规划算法:多目标、多阶段优化。
穷举算法:万能,受问题规模限制。
遗传算法:只是比漫无目的的穷举搜索算法聪明一点点,通过较小的计算量获得较大的收益。
只要能用解析的方法直接得到的最优解问题,都不要试图用遗传算法。
适合-非线性问题。人工智能、自适应控制、机器学习等领域。
不依赖目标函数。
基于概率论,而不是一个确定的搜索过程,即每一次启发式搜索,可能会得出不同的最优解。
可能得到局部最优解或近似最优解。
迭代流程:
初始化种群
种群N个体评价
选择
交叉
变异
种群N+1
1-编码方式:二进制编码(汉明距离)、格雷编码、符号编码、属性序列编码。
2-适应度评估函数(关键点):
    固定的问题:运算初期早熟问题(未成熟收敛局部最优解),运算后期竞争区分度不高问题(等概率平均搜索)
    自适应的改进:尺度变换:线性、乘方、指数。
种群大小M32
交叉概率PC0.8
变异概率PM0.15
进化代数T500

用遗传算法解决0-1背包问题。
1-问题的解收敛了,但没有收敛到最优解 - 通过将最优解与实际结果比较,也可以循环100次,取价值最大的解。
2-self.total_fitness = 1 # 每次计算时,先将总数置0,在循环中,会产生全0的现象
     - envaluateFitness中加入防护,如果某个种群全零,则对其进行调整。
3-本例中,循环执行遗传算法24次,得到全局最优解,且结果收敛。
'''
import os
import random
from copy import deepcopy

class GAType(): # 种群32    def __init__(self, obj_count):
        self.gene = [0 for x in range(0, obj_count, 1)]   # 序列编码 0 / 1
        self.fitness = 0 # 适应度
        self.cho_feq = 0 # choose 选择概率
        self.cum_feq = 0 # cumulative 累积概率

class genetic():
    def __init__(self, value, weight, max_weight):
        self.value = value
        self.weight = weight
        self.max_weight = max_weight
        self.obj_count = len(weight)
        self._gatype = [GAType(self.obj_count) for x in range(0, population_size, 1)]  # 初始化32个种群
        self.total_fitness = 0

    def avoid_zero(self):
        '''防止遗传的下一代为全零,若为全零,则将随机的位数(1-7)置1'''
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值